const { DataTypes, Model } = require('sequelize')
const { generatId, formatReturnId } = require('@/utils/idUtil')
const Mysequelize = require('./index')
const baseModel = require('./baseModel')

class User extends Model {}
User.init(
  {
    id: {
      type: DataTypes.BIGINT,
      defaultValue: generatId(),
      primaryKey: true,
      allowNull: false,
      get() {
        return formatReturnId(this.getDataValue('id'))
      },
      set(value) {
        this.setDataValue('id', BigInt(value))
      }
    },
    username: {
      type: DataTypes.STRING(50),
      allowNull: false,
      unique: true
    },
    sex: {
      type: DataTypes.TINYINT(1),
      defaultValue: 0
    },
    roleId: {
      type: DataTypes.BIGINT,
      allowNull: false,
      field: 'role_id',
      get() {
        return formatReturnId(this.getDataValue('roleId'))
      },
      set(value) {
        this.setDataValue('roleId', BigInt(value))
      }
    },
    phone: {
      type: DataTypes.STRING(11)
    },
    email: {
      type: DataTypes.STRING(50)
    },
    avator: {
      type: DataTypes.STRING(255)
    },
    password: {
      type: DataTypes.STRING(255)
      // 对密码进行hash加盐
      // async set(value) {
      //   // console.log(value)
      //   if (!value) {
      //     return
      //   }
      //   const salt = genSalt()
      //   // 每次设置密码生成随机盐值以及加密后结果
      //   const pwd = await MD5(value, salt)
      //   this.setDataValue('password', pwd)
      //   // this.setDataValue('salt', salt)
      //   // const t = await Mysequelize.transaction()
      //   // try {
      //   //   await User.update(
      //   //     {
      //   //       salt
      //   //     },
      //   //     {
      //   //       where: {
      //   //         id: BigInt(this.getDataValue('id'))
      //   //       }
      //   //     }
      //   //   )
      //   //   await t.commit()
      //   // } catch {
      //   //   await t.rollback()
      //   // }
      // }
    },
    nickname: {
      type: DataTypes.STRING(50)
    },
    salt: {
      type: DataTypes.STRING(255)
    },
    isActive: {
      type: DataTypes.TINYINT(1),
      defaultValue: 1,
      field: 'is_active'
    },
    ...baseModel
  },
  {
    // 这是其他模型参数
    sequelize: Mysequelize, // 我们需要传递连接实例
    modelName: 'User', // 我们需要选择模型名称
    tableName: 'user', // 数据库表名称
    createdAt: 'createTime',
    // 想要 updatedAt 但是希望名称叫做 updateTime
    updatedAt: 'updateTime'
  }
)

// 定义的模型是类本身
// console.log(User === sequelize.models.User); // true
module.exports = User
